setImmediate与nextTick | 您所在的位置:网站首页 › nexttick node › setImmediate与nextTick |
Node.js版本0.10今天发布并推出 setImmediate.该API的变化文档建议做递归时使用它nextTick调用. 从MDN看起来它看起来非常相似process.nextTick. 我nextTick应该何时使用,何时使用setImmediate? 问题回答使用setImmediate如果要排队的任何I/O事件回调中已经存在的事件队列后面的功能.用于process.nextTick在事件队列的头部有效地对函数进行排队,以便在当前函数完成后立即执行. 因此,在您尝试使用递归分解长时间运行的CPU绑定作业的情况下,您现在希望使用setImmediate而不是process.nextTick排队下一次迭代,否则任何I/O事件回调都不会有机会在迭代之间运行. 问题回答作为例证 import fs from 'fs'; import http from 'http'; const options = { host: 'www.stackoverflow.com', port: 80, path: '/index.html' }; describe('deferredExecution', () => { it('deferredExecution', (done) => { console.log('Start'); setTimeout(() => console.log('TO1'), 0); setImmediate(() => console.log('IM1')); process.nextTick(() => console.log('NT1')); setImmediate(() => console.log('IM2')); process.nextTick(() => console.log('NT2')); http.get(options, () => console.log('IO1')); fs.readdir(process.cwd(), () => console.log('IO2')); setImmediate(() => console.log('IM3')); process.nextTick(() => console.log('NT3')); setImmediate(() => console.log('IM4')); fs.readdir(process.cwd(), () => console.log('IO3')); console.log('Done'); setTimeout(done, 1500); }); });将给出以下输出 Start Done NT1 NT2 NT3 TO1 IO2 IO3 IM1 IM2 IM3 IM4 IO1我希望这有助于理解其中的差异. 问题回答我想我可以很好地说明这一点.由于nextTick在当前操作结束时调用,因此递归调用它最终会阻止事件循环继续.setImmediate通过在事件循环的检查阶段触发来解决这个问题,允许事件循环正常继续. ????????????????????????? ??>? timers ? ? ????????????????????????? ? ????????????????????????? ? ? I/O callbacks ? ? ????????????????????????? ? ????????????????????????? ? ? idle, prepare ? ? ????????????????????????? ????????????????? ? ????????????????????????? ? incoming: ? ? ? poll ? |
CopyRight 2018-2019 实验室设备网 版权所有 |